package com.caregiver.watch.business.user.model.po;

import com.caregiver.watch.business.user.enums.WeekDay;
import com.caregiver.watch.business.user.utils.reminder.RepeatDaysMaskUtil;
import lombok.Data;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

/**
 * 用户提醒通知实体类
 */
@Data
public class UserReminder {
    
    /**
     * 主键ID
     */
    private Long id;
    
    /**
     * 用户ID
     */
    private Long userId;
    
    /**
     * 提醒名称
     */
    private String reminderName;
    
    /**
     * 提醒内容
     */
    private String content;
    
    /**
     * 提醒开始时间
     */
    private LocalTime startTime;
    
    /**
     * 提醒结束时间
     */
    private LocalTime endTime;
    
    /**
     * 提醒间隔
     */
    private Integer intervalValue;
    
    /**
     * 提醒间隔单位
     */
    private String intervalUnit;
    
    /**
     * 重复天(位掩码存储星期选择)
     */
    private Integer repeatDays;
    
    /**
     * 是否启用(0-禁用, 1-启用)
     */
    private Integer isEnabled;
    
    /**
     * 创建时间
     */
    private LocalDateTime createdTime;
    
    /**
     * 更新时间
     */
    private LocalDateTime updatedTime;
    
    /**
     * 删除标志(0-未删除, 1-已删除)
     */
    private Integer delFlag;

    /**
     * 获取重复的星期集合
     * @return 星期集合
     */
    public Set<WeekDay> getRepeatDaysSet() {
        if (this.repeatDays == null) {
            return new HashSet<>();
        }
        return RepeatDaysMaskUtil.fromMaskValue(this.repeatDays);
    }

    /**
     * 设置重复的星期集合
     * @param days 星期集合
     */
    public void setRepeatDaysSet(Set<WeekDay> days) {
        this.repeatDays = RepeatDaysMaskUtil.toMaskValue(days);
    }

    /**
     * 检查是否在指定星期重复
     * @param day 星期
     * @return 是否重复
     */
    public boolean isRepeatOn(WeekDay day) {
        if (this.repeatDays == null) {
            return false;
        }
        return RepeatDaysMaskUtil.contains(this.repeatDays, day);
    }

    /**
     * 添加重复星期
     * @param day 星期
     */
    public void addRepeatDay(WeekDay day) {
        if (this.repeatDays == null) {
            this.repeatDays = 0;
        }
        this.repeatDays = RepeatDaysMaskUtil.addDay(this.repeatDays, day);
    }

    /**
     * 移除重复星期
     * @param day 星期
     */
    public void removeRepeatDay(WeekDay day) {
        if (this.repeatDays != null) {
            this.repeatDays = RepeatDaysMaskUtil.removeDay(this.repeatDays, day);
        }
    }
}
